using Baci.Net.ToolKit.ArcGISProGeoprocessor.Models;
using Baci.Net.ToolKit.ArcGISProGeoprocessor.Models.Attributes;
using Baci.Net.ToolKit.ArcGISProGeoprocessor.Models.Attributes.DomainAttributes;
using Baci.Net.ToolKit.ArcGISProGeoprocessor.Models.Enums;
using System.Collections.Generic;
using System.ComponentModel;

namespace Baci.ArcGIS._GeostatisticalAnalystTools._Interpolation
{
    /// <summary>
    /// <para>Moving Window Kriging</para>
    /// <para>Recalculates the Range, Nugget, and Partial Sill semivariogram parameters based on a smaller neighborhood, moving through all location points.</para>
    /// <para>基于较小的邻域重新计算 Range、Nugget 和 Partial Sill 半变异函数参数，并移动所有位置点。</para>
    /// </summary>    
    [DisplayName("Moving Window Kriging")]
    public class GAMovingWindowKriging : AbstractGPProcess
    {
        /// <summary>
        /// 无参构造
        /// </summary>
        public GAMovingWindowKriging()
        {

        }

        /// <summary>
        /// 有参构造
        /// </summary>
        /// <param name="_in_ga_model_source">
        /// <para>Input geostatistical model source</para>
        /// <para>The geostatistical model source to be analyzed.</para>
        /// <para>要分析的地统计模型源。</para>
        /// </param>
        /// <param name="_in_datasets">
        /// <para>Input dataset(s)</para>
        /// <para>The name of the input datasets and field names used in the creation of the output layer.</para>
        /// <para>用于创建输出图层的输入数据集的名称和字段名称。</para>
        /// </param>
        /// <param name="_in_locations">
        /// <para>Input point observation locations</para>
        /// <para>Point locations where predictions will be performed.</para>
        /// <para>将执行预测的点位置。</para>
        /// </param>
        /// <param name="_neighbors_max">
        /// <para>Maximum neighbors to include</para>
        /// <para>Number of neighbors to use in the moving window.</para>
        /// <para>要在移动窗口中使用的邻居数。</para>
        /// </param>
        /// <param name="_out_featureclass">
        /// <para>Output feature class</para>
        /// <para>Feature class storing the results.</para>
        /// <para>存储结果的要素类。</para>
        /// </param>
        public GAMovingWindowKriging(object _in_ga_model_source, object _in_datasets, object _in_locations, long? _neighbors_max, object _out_featureclass)
        {
            this._in_ga_model_source = _in_ga_model_source;
            this._in_datasets = _in_datasets;
            this._in_locations = _in_locations;
            this._neighbors_max = _neighbors_max;
            this._out_featureclass = _out_featureclass;
        }
        public override string ToolboxName => "Geostatistical Analyst Tools";

        public override string ToolName => "Moving Window Kriging";

        public override string CallName => "ga.GAMovingWindowKriging";

        public override List<string> AcceptEnvironments => ["cellSize", "coincidentPoints", "extent", "geographicTransformations", "mask", "outputCoordinateSystem", "parallelProcessingFactor", "scratchWorkspace", "snapRaster", "workspace"];

        public override object[] ParameterInfo => [_in_ga_model_source, _in_datasets, _in_locations, _neighbors_max, _out_featureclass, _cell_size, _out_surface_grid];

        /// <summary>
        /// <para>Input geostatistical model source</para>
        /// <para>The geostatistical model source to be analyzed.</para>
        /// <para>要分析的地统计模型源。</para>
        /// <para></para>
        /// </summary>
        [DisplayName("Input geostatistical model source")]
        [Description("")]
        [Option(OptionTypeEnum.Must)]
        public object _in_ga_model_source { get; set; }


        /// <summary>
        /// <para>Input dataset(s)</para>
        /// <para>The name of the input datasets and field names used in the creation of the output layer.</para>
        /// <para>用于创建输出图层的输入数据集的名称和字段名称。</para>
        /// <para></para>
        /// </summary>
        [DisplayName("Input dataset(s)")]
        [Description("")]
        [Option(OptionTypeEnum.Must)]
        public object _in_datasets { get; set; }


        /// <summary>
        /// <para>Input point observation locations</para>
        /// <para>Point locations where predictions will be performed.</para>
        /// <para>将执行预测的点位置。</para>
        /// <para></para>
        /// </summary>
        [DisplayName("Input point observation locations")]
        [Description("")]
        [Option(OptionTypeEnum.Must)]
        public object _in_locations { get; set; }


        /// <summary>
        /// <para>Maximum neighbors to include</para>
        /// <para>Number of neighbors to use in the moving window.</para>
        /// <para>要在移动窗口中使用的邻居数。</para>
        /// <para></para>
        /// </summary>
        [DisplayName("Maximum neighbors to include")]
        [Description("")]
        [Option(OptionTypeEnum.Must)]
        public long? _neighbors_max { get; set; }


        /// <summary>
        /// <para>Output feature class</para>
        /// <para>Feature class storing the results.</para>
        /// <para>存储结果的要素类。</para>
        /// <para></para>
        /// </summary>
        [DisplayName("Output feature class")]
        [Description("")]
        [Option(OptionTypeEnum.Must)]
        public object _out_featureclass { get; set; }


        /// <summary>
        /// <para>Output cell size</para>
        /// <para><xdoc>
        ///   <para>The cell size at which the output raster will be created.</para>
        ///   <para>This value can be explicitly set in the Environments by the Cell Size parameter.</para>
        ///   <para>If not set, it is the shorter of the width or the height of the extent of the input point features, in the input spatial reference, divided by 250.</para>
        /// </xdoc></para>
        /// <para><xdoc>
        ///   <para>将创建输出栅格的像元大小。</para>
        ///   <para>此值可以通过像元大小参数在“环境”中显式设置。</para>
        ///   <para>如果未设置，则为输入空间参考中输入点要素范围的宽度或高度除以 250 的较短者。</para>
        /// </xdoc></para>
        /// <para></para>
        /// </summary>
        [DisplayName("Output cell size")]
        [Description("")]
        [Option(OptionTypeEnum.optional)]
        public object _cell_size { get; set; } = null;


        /// <summary>
        /// <para>Output surface raster</para>
        /// <para>The prediction values in the output feature class are interpolated onto a raster using the Local polynomial interpolation method.</para>
        /// <para>使用局部多项式插值方法将输出要素类中的预测值插值到栅格上。</para>
        /// <para></para>
        /// </summary>
        [DisplayName("Output surface raster")]
        [Description("")]
        [Option(OptionTypeEnum.optional)]
        public object _out_surface_grid { get; set; } = null;


        public GAMovingWindowKriging SetEnv(object cellSize = null, object coincidentPoints = null, object extent = null, object geographicTransformations = null, object mask = null, object outputCoordinateSystem = null, object parallelProcessingFactor = null, object scratchWorkspace = null, object snapRaster = null, object workspace = null)
        {
            base.SetEnv(cellSize: cellSize, coincidentPoints: coincidentPoints, extent: extent, geographicTransformations: geographicTransformations, mask: mask, outputCoordinateSystem: outputCoordinateSystem, parallelProcessingFactor: parallelProcessingFactor, scratchWorkspace: scratchWorkspace, snapRaster: snapRaster, workspace: workspace);
            return this;
        }

    }

}